用NODEJS处理EXCEL文件导入导出,文件上传 - 三积木 - 博客频道 - CSDN.NET

创建时间:2017/4/6 10:02
来源:http://blog.csdn.net/jiangkai528/article/details/46377299


分类:
node(4) javascript(4)
.

版权声明:本文为博主原创文章,未经博主允许不得转载。


参考文章

http://librajt.github.io/2013/08/04/handle-excel-file-with-nodejs/


对比了 ExcelJS , https://github.com/guyonroche/exceljs#create-a-workbook

node-xlsxhttps://github.com/mgcrea/node-xlsx

等 nodejs 等现有组件,决定使用node-xlsx


node-xlsx 基于现有前端强大组件 js-xlsx, https://github.com/SheetJS/js-xlsx

简单使用例子:

[javascript] view plain copy
  1. var express = require('express');  
  2. var router = express.Router();  
  3. var xlsx = require('node-xlsx');  
  4. var fs = require('fs');  
  5.   
  6. /* GET import excel test. */  
  7. router.get('/importExcel'function(req, res, next) {  
  8.  var filename='./public/test.xlsx';  
  9.  console.error(filename);  
  10.  // read from a file  
  11. var obj = xlsx.parse(filename);  
  12. console.log(JSON.stringify(obj));  
  13.    
  14. res.send('import successfully!');  
  15. });  
  16. /* GET export excel test. */  
  17. router.get('/exportExcel'function(req, res, next) {  
  18. // write  
  19. var data = [[1,2,3],[truefalsenull'sheetjs'],['foo','bar',new Date('2014-02-19T14:30Z'), '0.3'], ['baz'null'qux']];  
  20. var buffer = xlsx.build([{name: "mySheetName", data: data}]);  
  21. fs.writeFileSync('b.xlsx', buffer, 'binary');  
  22. res.send('export successfully!');  
  23.   
  24. });  


补充:

文件上传操作可以选择以下两种

fs                           https://github.com/jprichardson/node-fs-extra

formidable   https://github.com/felixge/node-formidable

上传参考代码1: http://www.tuicool.com/articles/F7JrMjj 

              https://cnodejs.org/topic/4f40a4dc0feaaa4424081758


上传文件  (记得创建上传文件的目录,例如public/upload )

routes/test.js

[javascript] view plain copy
  1. var formidable = require('formidable');  
  2. var http = require('http');  
  3. var util = require('util');  
  4. var express = require('express');  
  5. var fs = require('fs');  
  6. var path = require('path');  
  7. var favicon = require('serve-favicon');  
  8. var bodyParser = require('body-parser');  
  9.   
  10. var app = express();  
  11. var server = http.createServer(app);  
  12.   
  13. server.listen(3000);  
  14.   
  15. app.set('views''/views');  
  16. //app.use(favicon('/public/favicon.ico'));  
  17. app.use(bodyParser());  
  18. app.use('/public',express.static(path.join(__dirname, 'public')));  
  19.   
  20.   
  21. app.get('/',function(req, res) {  
  22.   
  23. res.writeHead(200, {'content-type''text/html'});  
  24. res.end(  
  25. '<form action="/upload" enctype="multipart/form-data" method="post">'+  
  26. '<input type="text" name="title"><br>'+  
  27. '<input type="file" name="upload" multiple="multiple"><br>'+  
  28. '<input type="submit" value="Upload">'+  
  29. '</form>'  
  30. );  
  31. });  
  32.   
  33. app.post('/upload'function(req,res) {  
  34.   
  35.  console.log(" ########## POST /upload ####### ");  
  36.     var fileTypeError = false;  
  37.     var target_path = __dirname+"/upload";  
  38.     var form = new formidable.IncomingForm();  
  39.     form.encoding = 'utf-8';  
  40.     form.keepExtensions = true;  
  41.     form.maxFieldsSize = 10 * 1024 * 1024;  
  42.     form.uploadDir = target_path;  
  43.   
  44.     var fields = [];  
  45.     var files = [];  
  46.   
  47.     form.on('field'function (field, value) {  
  48.         fields.push([field, value]);  
  49.     });  
  50.     form.on('file'function (field, file) {  
  51.         console.log('upload file: ' + file.name);  
  52.        //判断文件类型是否是xlsx  
  53.         if (file.type != 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {  
  54.             fileTypeError = true;  
  55.         }  
  56.         files.push([field, file]);  
  57.     });  
  58.   
  59.     form.on('end'function () {  
  60.   
  61.         //遍历上传文件  
  62.         var fileName = '';  
  63.         var obj = '';  
  64.         var folder_exists = fs.existsSync(target_path);  
  65.         if (folder_exists) {  
  66.             var dirList = fs.readdirSync(target_path);  
  67.             dirList.forEach(function (item) {  
  68.                 if (!fs.statSync(target_path + '/' + item).isDirectory()) {  
  69.                     console.log('parse item:' + target_path + '/' + item);  
  70.                     fileName = target_path + '/' + item;  
  71.                     if (!fileTypeError) {  
  72.                         //解析excel  
  73.                         obj = xlsx.parse(fileName);  
  74.                         console.log(JSON.stringify(obj));  
  75.                         //insert into DB  
  76.                         //todo  
  77.                         res.send({"rtnCode""0""rtnInfo""成功导入数据"});  
  78.                     } else {  
  79.                         res.send({"rtnCode""1""rtnInfo""文件格式不正确"});  
  80.                     }  
  81.                     //delete file  
  82.                     fs.unlinkSync(fileName);  
  83.   
  84.                 }  
  85.             });  
  86.         }else{  
  87.             res.send({"rtnCode""1""rtnInfo""系统错误"});  
  88.         }  
  89.   
  90.     });  
  91.     form.on('error'function(err) {  
  92.         res.send({"rtnCode""1""rtnInfo""上传出错"});  
  93.     });  
  94.     form.on('aborted'function() {  
  95.         res.send({"rtnCode""1""rtnInfo""放弃上传"});  
  96.     });  
  97.     form.parse(req);  
  98.       
  99.       
  100. });  



其他参考://返回上传进度


[javascript] view plain copy
  1. form.on('progress'function(bytesReceived, bytesExpected) {  
  2.   var progress = {  
  3.     type: 'progress',  
  4.     bytesReceived: bytesReceived,  
  5.     bytesExpected: bytesExpected  
  6.   };  
  7.   
  8.   socket.broadcast(JSON.stringify(progress));  
  9. });  


.
1
0
.